<?php

namespace app\api\Service;

use app\common\library\Auth;
use app\common\library\Sms as Smslib;
use think\Validate;
use think\Config;
use think\Db;
use fast\Http;
use wxpay\WxPay;
use think\Cache;


class HouseholdService
{
    // 获取功率列表
    /**
     * 获取权限列表
     *
     * 本函数用于获取系统中所有正常状态的权限类型，按照权重降序排列
     * 主要用于展示或操作权限时获取权限类型列表
     *
     * @return array 返回一个包含权限列表的数组
     */
    public static function getPower()
    {
        // 查询状态为正常的所有权限类型，按权重降序排列，只获取id和name字段
        $list = \app\admin\model\PowerType::where(['status'=>'normal'])
            ->order('weigh desc')->field('id,name')->select();

        // 返回查询结果，包括状态码、提示信息和查询到的权限列表
        return ['code' =>1,'msg'=>'查询成功','data'=>$list];
    }

    // 获取套餐列表
    /**
     * 获取套餐列表
     *
     * 本函数用于获取系统中所有正常状态的套餐，按照权重降序排列
     * 主要用于展示或操作套餐时获取套餐列表
     *
     * @return array 返回一个包含套餐列表的数组
     */
    public static function getPackage($data)
    {
        $power_id = $data['power_id'];

        // 查询状态为正常的所有套餐，按权重降序排列，只获取id、name、title和sales字段
        $list = \app\admin\model\Package::where(['power_id'=>$power_id,'status'=>'normal'])
            ->order('weigh desc')->field('id,name,title,sales')->select();

        // 如果查询到的套餐列表不为空，则遍历每个套餐，获取其价格信息
        if($list){
            foreach($list as &$item){
                // 查询当前套餐下所有正常状态的套餐类型的价格信息
                $item['price'] = \app\admin\model\PackageType::where(['package_id'=>$item['id'],'status'=>'normal'])
                    ->field('price')->select();
            }
        }

        // 返回查询结果，包括状态码、提示信息和查询到的套餐列表
        return ['code' =>1,'msg'=>'查询成功','data'=>$list];
    }

    // 获取套餐类型列表
    /**
     * 获取指定包裹的类型信息
     *
     * 本函数根据提供的包裹ID，从数据库中查询对应的状态为正常的包裹类型信息，并按权重降序排列
     * 函数主要完成以下任务：
     * 1. 从输入数据中提取包裹ID
     * 2. 使用包裹ID查询数据库中的包裹类型信息
     * 3. 返回查询结果，包括包裹类型的ID、名称、类型、备注、价格、范围和超越信息
     *
     * @param array $data 包含包裹ID的数据数组，键包括'package_id'
     * @return array 包含查询结果的数组，格式为['code' => 1, 'msg' => '查询成功', 'data' => $list]
     */
    public static function getPackageType($data)
    {
        // 从输入数据中提取包裹ID
        $package_id = $data['package_id'];

        // 查询数据库中状态为正常的包裹类型信息，并按权重降序排列
        $list = \app\admin\model\PackageType::where(['package_id'=>$package_id,'status'=>'normal'])
            ->order('weigh desc')->field('id,name,type,memo,price,range,beyond')->select();

        // 返回查询结果
        return ['code' =>1,'msg'=>'查询成功','data'=>$list];
    }

    // 创建订单
/**
 * 创建安装订单
 *
 * @param array $data 订单数据，包括功率ID、套餐ID、套餐类型ID、省份ID、城市ID、区县ID、详细地址、手机号、预约时间、价格和额外费用
 * @return array 返回结果数组，包含code、msg和data字段
 */
public static function createOrder($data)
{

    // 获取当前用户认证信息
    $auth = Auth::instance();
    // 获取当前用户ID
    $user_id = $auth->id;
    
    
    // 防止重复提交
    //构建用户特定的请求时间键
    $requestKey = "last_request_time_{$user_id}";
    $lastRequestTime = Cache::get($requestKey);
    $currentTime = time();

    if ($lastRequestTime && ($currentTime - $lastRequestTime < 5)) {
        return ['code'=>0,'msg'=>"请求太频繁，请稍后再试", 'data'=>''];
    }
    // 更新最后一次请求时间
    Cache::set($requestKey, $currentTime);
    
    
    // 从传入的数据中提取相关信息
    $power_id = $data['power_id'];
    $package_id = $data['package_id'];
    $package_type_id = $data['package_type_id'];
    $province_id = $data['province_id'];
    $city_id = $data['city_id'];
    $area_id = $data['area_id'];
    $address = $data['address'];
    $address_lng = $data['address_lng'];
    $address_lat = $data['address_lat'];
    $mobile = $data['mobile'];
    $name = $data['name'];
    $reservation_time = $data['reservation_time'];
    $price = $data['price'];
    // 获取额外费用，如果未设置，则默认为0
    $extra_money = isset($data['extra_money']) ? $data['extra_money'] : 0;

    // 验证功率参数有效性
    $power_name = \app\admin\model\PowerType::where(['id'=>$power_id,'status'=>'normal'])->value('name');
    if(!$power_name) return ['code'=>0,'msg'=>"功率参数无效", 'data'=>''];
    // 验证套餐参数有效性
    $package_name = \app\admin\model\Package::where(['id'=>$package_id,'status'=>'normal'])->value('name');
    if(!$package_name) return ['code'=>0,'msg'=>"套餐参数无效", 'data'=>''];
    // 验证套餐类型有效性
    $package_type = \app\admin\model\PackageType::where(['id'=>$package_type_id,'status'=>'normal'])->field('name,type,memo')->find();
    if(!$package_type) return ['code'=>0,'msg'=>"套餐类型无效", 'data'=>''];
    // 验证省份信息是否填写
    if(!$province_id) return ['code'=>0,'msg'=>"请选择省份", 'data'=>''];
    // 验证城市信息是否填写
    if(!$city_id) return ['code'=>0,'msg'=>"请选择城市", 'data'=>''];
    // 验证区县信息是否填写
    if(!$area_id) return ['code'=>0,'msg'=>"请选择区县", 'data'=>''];

    // 验证详细地址是否填写
    if(!$address) return ['code'=>0,'msg'=>"请填写详细地址", 'data'=>''];
    if(!$address_lng || !$address_lat) return ['code'=>0,'msg'=>"地址经纬度无效", 'data'=>''];
    if(!$name) return ['code'=>0,'msg'=>"请填写姓名", 'data'=>''];
    // 验证手机号格式是否正确
    if(!Validate::regex($mobile, "^1\d{10}$")) return ['code'=>0,'msg'=>"手机号不正确", 'data'=>''];
    // 验证预约时间是否选择
    if(!$reservation_time) return ['code'=>0,'msg'=>"请选择预约时间", 'data'=>''];
    // 验证套餐价格是否正确
    $package_price = \app\admin\model\PackageType::where(['id'=>$package_type_id,'status'=>'normal'])->value('price');
    if($package_price != $price) return ['code'=>0,'msg'=>"套餐价格错误", 'data'=>''];
    // 计算订单总金额
    $amount = $price + $extra_money;

    // 开始事务处理
    try{
        // 生成新的订单号
        $order_no = getNewOrderNo(16);
        // 准备订单数据
        $params_order = [
            'order_no'      =>  $order_no,
            'type'  => 'install',
            'user_id'      =>  $user_id,
            'province_id'      =>  $province_id,
            'city_id'      =>  $city_id,
            'area_id'      =>  $area_id,
            'address'      =>  $address,
            'address_lng'      =>  $address_lng,
            'address_lat'      =>  $address_lat,
            'mobile'      =>  $mobile,
            'name'      =>  $name,
            'reservation_time'      =>  $reservation_time,
            'amount'      =>  $amount,
            'payamount'      =>  $amount,
        ];
        // 创建订单
        $res = \app\admin\model\Order::create($params_order);

        // 准备安装订单数据
        $params_install = [
            'order_id'  => $res['id'],
            'power_id'      =>  $power_id,
            'power_name'      =>  $power_name,
            'package_id'      =>  $package_id,
            'package_name'      =>  $package_name,
            'package_type_id'      =>  $package_type_id,
            'package_type_name'      =>  $package_type['name'] . '(' . $package_type['type'] .')' ,
            'price'      =>  $price,
            'extra_money'      =>  $extra_money,
        ];
        // 创建安装订单
        $ret = \app\admin\model\OrderInstall::create($params_install);

        // 提交事务
        Db::commit();
        // 判断订单和安装订单是否创建成功
        if($res && $ret){
            // 成功时返回成功信息和订单ID
            return ['code'=>1,'msg'=>'操作成功','data'=>['order_id'=>$res['id']]];
        }else{
            // 失败时返回失败信息
            return ['code'=>0,'msg'=>'操作失败','data'=>''];
        }
    }catch(\Exception $e){
        // 回滚事务
        Db::rollback();
        // 异常时返回异常信息
        return ['code'=>0,'message'=>$e->getMessage(),'data'=>''];
    }

}

}